delete [] p; //older compilers require you to use 'delete [100] p'
Any time you allocate an array of things (ie: any time you use the '[...]' in the 'new' expression) you *!*MUST*!* use the '[]' in the 'delete' statement.
The fact that there is no syntactic difference between a ptr to a thing and a ptr to an array of things is an artifact we inherited from C.